package com.star.encode;

import java.io.UnsupportedEncodingException;

/**
 * @author: liminghui
 * @date: 2021/6/3 15:54
 * @version: 1.0
 * @description:
 */
public class EncodingTest {
    public static void main(String[] args) throws UnsupportedEncodingException {

        String str = "锟斤拷锟杰凤拷锟斤拷 锟斤拷锟矫凤拷式锟斤拷 MD5 md = new MD5(); String code = md.toDigest(\"锟斤拷锟杰诧拷锟斤拷\");code锟斤拷锟角硷拷锟杰猴拷锟斤拷锟斤拷锟�";
        String str2 = "���ܷ��� ���÷�ʽ�� MD5 md = new MD5(); String code = md.toDigest(\"���ܲ���\");code���Ǽ��ܺ������?";


        String gbk = new String(str2.getBytes("utf-8"), "gbk");


        System.out.println(gbk);

        // testKunJinKao();
    }

    public static void testKunJinKao() {
        String str = "我不是锟斤拷";
        try {
            byte[] buff = null;

            //让我们先看看几种错误的转换,let's go

            //1. 正常的GBK字节流，你以为是UTF-8，所以用UTF-8去解码...
            buff = str.getBytes("GBK");//这里只要不抛异常，数据一定不会被破坏
            String str1 = new String(buff, "UTF-8");
            System.out.println(str1);//这是一种情形:���

            //2. 正常的UTF-8字节流，你以为是GBK，所以用GBK去解码...
            buff = str.getBytes("UTF-8");//这里只要不抛异常，数据一定不会被破坏
            String str2 = new String(buff, "GBK");//这里破坏了
            System.out.println(str2);//这是另外一种情形：

            //说了半天，锟斤拷在哪里呢？come on

            //3. 本来正常的GBK字节码，在你不知道的某个环节已经被错误的使用UTF-8解码了
            String str3 = new String(str.getBytes("GBK"), "UTF-8");
            String str4 = new String(str3.getBytes("UTF-8"), "GBK");//这里你并不知道数据已经破坏了，这样用是对的。
            System.out.println(str4);//锟斤拷

            /**
             * Got it.How are you,nice to meet you.
             *
             * Why?
             * 如果说情形1、2是开发者自己造成的，
             * 那么情形3往往是开发者被坑了，别人造成的（也可能是容器层），总之你拿到的时候已经乱了。
             */

            /**
             * 细心的你会发现，正是情形1的错误，导致了情形3的发生。之所以表现不同，是因为情形1的程序猿是在UTF-8下打印输出；
             * 而情形3是在GBK下打印输出。
             */

            /**
             * 总结一下，锟斤拷是怎么产生的？
             *
             * 源于GBK字符集和Unicode字符集之间的转换问题。
             * Unicode和老编码体系的转化过程中，肯定有一些字，用Unicode是没法表示的，
             * Unicode官方用了一个占位符(REPLACEMENT CHARACTER)来表示这些文字，这就是：U+FFFD
             *
             * U+FFFD的UTF-8编码出来，恰好是 '\xef\xbf\xbd'。
             *
             * 重复多次，例如 '\xef\xbf\xbd\xef\xbf\xbd'，
             * 然后放到GBK/CP936/GB2312/GB18030的环境中显示的话，
             * 一个汉字2个字节，最终的结果就是：锟斤拷——锟(0xEFBF)，斤（0xBDEF），拷（0xBFBD）。
             */
        } catch (Exception e) {
            e.printStackTrace();
        }


    }
}
